//
//  Extension.swift
//  Demo
//
//  Created by 杨林杰 on 2018/5/4.
//  Copyright © 2018年 YLJ. All rights reserved.
//

import UIKit

/// 导航返回协议
@MainActor
@objc public protocol NavigationProtocol  {
    /// 导航将要返回方法
    ///
    /// - Returns: true: 返回上一界面， false: 禁止返回
    @objc optional func navigationShouldPopMethod() -> Bool
    
    @objc optional func backAction()
}


extension UIViewController: NavigationProtocol {
    ///是否允许侧滑返回
    @objc open func navigationShouldPopMethod() -> Bool {
        return true
    }
    
    /// 返回事件
    @objc open func backAction(){
        self.navigationController?.popViewController(animated: true);
    }
    
    /// 判断是否包含某个类型的控制器
    public func containsViewController(ofType targetType: AnyClass) -> Bool {
        guard let viewControllers = navigationController?.viewControllers else { return false }
        return viewControllers.contains { $0.isKind(of: targetType) }
    }
    
}


// MARK: - 导航栏返回事件
extension UNNavigationController: UINavigationBarDelegate, UIGestureRecognizerDelegate {
//extension UINavigationController: @retroactive UINavigationBarDelegate, @retroactive UIGestureRecognizerDelegate {
//    
    /// 导航栏返回按钮点击事件（遵守 UINavigationBarDelegate 协议）
    /// - Parameters:
    ///   - navigationBar: 触发事件的导航栏
    ///   - item: 即将被弹出的导航项
    /// - Returns: 是否允许系统执行默认的弹出行为
    public func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool {
        if viewControllers.count < (navigationBar.items?.count)! {
            return true
        }
        var shouldPop = false
        let vc: UIViewController = topViewController!
        // responds 判断vc是否实现可以响应to事件
        if vc.responds(to: #selector(navigationShouldPopMethod)) {
            shouldPop = vc.navigationShouldPopMethod()
        }
        if shouldPop {
            // 会在当前执行完毕后，再执行闭包中的内容
            DispatchQueue.main.async {
                // 异步执行弹出操作（确保在 RunLoop 之后处理，避免导航栏状态混乱）
                self.popViewController(animated: true)
            }
        } else {
            // 修复导航栏按钮的透明度异常（系统默认会残留半透明按钮）
            for subview in navigationBar.subviews {
                if 0.0 < subview.alpha && subview.alpha < 1.0 {
                    UIView.animate(withDuration: 0.25) {
                        // 恢复完全可见
                        subview.alpha = 1.0
                    }
                }
            }
        }
        return false
    }
    
    
    /// 返回手势处理
    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        // 只有根界面的时候，不允许使用手势
        if children.count == 1 {
            return false
            // 判断是否实现了 是否运行手势返回的 方法
        } else if let topVC = topViewController as? NavigationProtocol, let shouldPop = topVC.navigationShouldPopMethod?() {
            return shouldPop
        }
        return true
    }
}
